package com.itheima.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.stereotype.Controller;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理
 *
 *@ControllerAdvice   通知
 *增强型控制器，对于控制器的全局配置放在同一个位置
 * {RestController.class, Controller.class}
 * 无论那个类 只要加了这两个任意一个注解都会都会被这个处理器进行处理
 *
 *@ResponseBody   把结构封装成json数据 进行返回
 * 设置当前控制器方法响应内容为当前返回值，无需解析
 * @Slf4j
 * 使用指定类初始化日志对象,在日志输出的时候,可以打印出日志信息所在的类
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 异常处理方法
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        //日志 输出异常信息   ex.getMessage() :获取的异常信息
        log.error(ex.getMessage());

        //判断是否是 重复异常   查看是否包含 "Duplicate entry"  是否违反唯一约束
        if(ex.getMessage().contains("Duplicate entry")){
            //把获取到的异常信息 进行分割 存放到 字符串类型数组中
            String[] split = ex.getMessage().split(" ");
            //获取重复字段 索引2位置
            String msg = split[2] + "已存在";
            return R.error(msg);
        }

        return R.error("未知错误");
    }


    /**
     * 异常处理方法
     *
     * 自定义的异常 CustomException
     * @return
     */
    @ExceptionHandler(CustomException.class)
    public R<String> exceptionHandler(CustomException ex){
        log.error(ex.getMessage());

        return R.error(ex.getMessage());
    }
}